#根据电影镜头中“打斗镜头”和“接吻镜头”个数给电影贴上“爱情片”或者“动作片”的标签
#训练样本数为7个，数据如下：
#	电影名称		打斗镜头		接吻镜头		电影类型
#	电影1		  3			  104		 爱情片
#	电影2		  2			  100		 爱情片
#	电影3		  1			  81		 爱情片
#	电影4		  101		  10		 动作片
#	电影5		  99		  5		 	 动作片
#	电影6		  98		  2		 	 动作片
#	电影7		  95		  4		 	 动作片
#	
#	待测数据
#	电影8		  18		  90		 ？？？
#	
#	本程序采用K—近邻算法求取结果

from numpy import *
import operator

def CreateDataSet():					#训练样本函数，返回训练样本数据和标签值
	datagroup = array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2], [95, 7]])
	labels = ["爱情片", "爱情片", "爱情片", "动作片", "动作片", "动作片", "动作片"]
	return datagroup, labels

def funKNN(inx, dataSet, labels, k):	#K-近邻算法实现
	dataNum = dataSet.shape[0]			#获取样本个数

	diffMat = tile(inx, (dataNum, 1)) - dataSet 	#此条语句计算待测数据inx与每个样本的每个特征的距离(差)
	sqDiffMat = diffMat ** 2						#此四条语句求取待测数据与每个样本的距离
	sqDistances = sqDiffMat.sum(axis = 1)
	distances = sqDistances ** 0.5

	sortedDistIndicies = distances.argsort()		#获取数组从小到大排列索引号

	classCount = {}
	for i in range(k):
		votelabel = labels[sortedDistIndicies[i]]	#获取距离最小前K个样本的标签并统计标签出现次数
		classCount[votelabel] = classCount.get(votelabel, 0) + 1
	
	sortedClassCount = sorted(classCount.items(), key = operator.itemgetter(1), reverse = True)
	return sortedClassCount[0][0]					#.items()字典所有项以列表方式返回 python3中
													#.iteritems()方法变成了.items(),reverse=True为降序

inx = array([18, 90])								#待测数据
dataSet, labels = CreateDataSet()					#样本数据

s = funKNN(inx, dataSet, labels, 3)					#第四个参数的取值会影响结果
print(s)